﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SIGCBI.Entities;
using System.Data;
using System.Data.Entity;
using System.Data.Objects;

namespace SIGCBI.Repository
{
    public interface IDetallePecosaRepository
    {
        List<DETALLE_PECOSA> GetAllDetallePecosaByPecosaId(Int32 idPecosa);
        List<DETALLE_PECOSA> GetFromDetallePecosaByProductoNombreAndPecosaId(string descripcion, Int32 idPecosa);
        DETALLE_PECOSA GetFromDetallePecosaByProductoIdAndPecosaId(Int32 idProducto, Int32 idPecosa);
        bool GetAllDetallePecosasByPecosaId(Int32 idPecosa);
        void RemoveDetallePecosaByProductoIdAndPecosaId(int idProducto, int idPecosa);

        List<DETALLE_PECOSA> GetFromKardexByNombreProducto_Fechas_IdProducto_OfPecosa(string descripcion, DateTime? fec1, DateTime? fec2, int IdProducto);
        List<DETALLE_PECOSA> GetAllFromKardexByIdProducto_OfPecosa(int IdProducto);
    }

    public class DetallePecosaRepository : MasterDataAccess, IDetallePecosaRepository
    {
        public List<DETALLE_PECOSA> GetAllFromDetallePecosaByPecosaId(int idPecosa)
        {
            var query = from c in Context.DETALLE_PECOSA.Include("PRODUCTO.UNIDAD_MEDIDA")
                        where c.IdPecosa.Equals(idPecosa)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public List<DETALLE_PECOSA> GetFromDetallePecosaByProductoAndPecosaId(string descripcion, int idPecosa)
        {
            if (descripcion != "")
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PRODUCTO.UNIDAD_MEDIDA")
                            where (c.PRODUCTO.Nombre.ToUpper().Contains(descripcion.ToUpper()))
                            && (c.IdPecosa.Equals(idPecosa))
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PRODUCTO.UNIDAD_MEDIDA")
                            where c.IdPecosa.Equals(idPecosa)
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
        }

        public DETALLE_PECOSA GetFromDetallePecosaByProductoIdAndPecosaId(int idProducto, int idPecosa)
        {
            var query = from c in Context.DETALLE_PECOSA
                        where c.IdProducto.Equals(idProducto) && c.IdPecosa.Equals(idPecosa)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.SingleOrDefault();
        }

        public bool GetAllDetallePecosasByPecosaId(int idPecosa)
        {
            var query = from c in Context.DETALLE_PECOSA.Include("PECOSA")
                        where c.IdPecosa.Equals(idPecosa)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.Any();
        }
        
        public void RemoveDetallePecosaByProductoIdAndPecosaId(int idProducto, int idPecosa)
        {
            var existe = Context.DETALLE_PECOSA.Where(c => c.IdPecosa.Equals(idPecosa)
                && c.PRODUCTO.ID.Equals(idProducto)).SingleOrDefault();

            Context.DETALLE_PECOSA.Remove(existe);
            Context.SaveChanges();
        }

        List<DETALLE_PECOSA> IDetallePecosaRepository.GetAllDetallePecosaByPecosaId(int idPecosa)
        {
            var query = from c in Context.DETALLE_PECOSA.Include("PRODUCTO.UNIDAD_MEDIDA")
                        where c.IdPecosa.Equals(idPecosa)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }

        public List<DETALLE_PECOSA> GetFromDetallePecosaByProductoNombreAndPecosaId(string descripcion, int idPecosa)
        {
            if (descripcion != "")
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PRODUCTO.UNIDAD_MEDIDA")
                            where (c.PRODUCTO.Nombre.ToUpper().Contains(descripcion.ToUpper()))
                            && (c.IdPecosa.Equals(idPecosa))
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PRODUCTO.UNIDAD_MEDIDA")
                            where c.IdPecosa.Equals(idPecosa)
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
        }


        public List<DETALLE_PECOSA> GetFromKardexByNombreProducto_Fechas_IdProducto_OfPecosa(string descripcion, DateTime? fec1, DateTime? fec2, int IdProducto)
        {
            if (descripcion != "")
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PECOSA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where (c.PRODUCTO.Nombre.ToUpper().Contains(descripcion.ToUpper()) ||
                            c.PRODUCTO.Codigo.ToUpper().Contains(descripcion.ToUpper()))
                            && (c.IdProducto.Equals(IdProducto))
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else if (fec1 != null && fec2 != null)
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PECOSA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where c.PECOSA.FechaSalida >= fec1.Value && c.PECOSA.FechaSalida <= fec2.Value
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else if (descripcion != "" && fec1 != null && fec2 != null)
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PECOSA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where (c.PRODUCTO.Nombre.ToUpper().Contains(descripcion.ToUpper()) ||
                            c.PRODUCTO.Codigo.ToUpper().Contains(descripcion.ToUpper()))
                            && c.PECOSA.FechaSalida >= fec1.Value && c.PECOSA.FechaSalida <= fec2.Value
                            && (c.IdProducto.Equals(IdProducto))
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
            else
            {
                var query = from c in Context.DETALLE_PECOSA.Include("PECOSA").Include("PRODUCTO.UNIDAD_MEDIDA")
                            where c.IdProducto.Equals(IdProducto)
                            select c;

                ObjectContext.Refresh(RefreshMode.StoreWins, query);

                return query.ToList();
            }
        }

        public List<DETALLE_PECOSA> GetAllFromKardexByIdProducto_OfPecosa(int IdProducto)
        {
            var query = from c in Context.DETALLE_PECOSA.Include("PRODUCTO.UNIDAD_MEDIDA")
                        where c.IdProducto.Equals(IdProducto)
                        select c;

            ObjectContext.Refresh(RefreshMode.StoreWins, query);

            return query.ToList();
        }
    }
}
